home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / dev / lang / Python16.lha / Python-1.6 / Lib / Python1.6 / toaiff.py < prev    next >
Encoding:
Python Source  |  2000-02-04  |  2.6 KB  |  104 lines

  1. """Convert "arbitrary" sound files to AIFF (Apple and SGI's audio format).
  2.  
  3. Input may be compressed.
  4. Uncompressed file type may be AIFF, WAV, VOC, 8SVX, NeXT/Sun, and others.
  5. An exception is raised if the file is not of a recognized type.
  6. Returned filename is either the input filename or a temporary filename;
  7. in the latter case the caller must ensure that it is removed.
  8. Other temporary files used are removed by the function.
  9. """
  10.  
  11. import os
  12. import tempfile
  13. import pipes
  14. import sndhdr
  15.  
  16. table = {}
  17.  
  18. t = pipes.Template()
  19. t.append('sox -t au - -t aiff -r 8000 -', '--')
  20. table['au'] = t
  21.  
  22. # XXX The following is actually sub-optimal.
  23. # XXX The HCOM sampling rate can be 22k, 22k/2, 22k/3 or 22k/4.
  24. # XXX We must force the output sampling rate else the SGI won't play
  25. # XXX files sampled at 5.5k or 7.333k; however this means that files
  26. # XXX sampled at 11k are unnecessarily expanded.
  27. # XXX Similar comments apply to some other file types.
  28. t = pipes.Template()
  29. t.append('sox -t hcom - -t aiff -r 22050 -', '--')
  30. table['hcom'] = t
  31.  
  32. t = pipes.Template()
  33. t.append('sox -t voc - -t aiff -r 11025 -', '--')
  34. table['voc'] = t
  35.  
  36. t = pipes.Template()
  37. t.append('sox -t wav - -t aiff -', '--')
  38. table['wav'] = t
  39.  
  40. t = pipes.Template()
  41. t.append('sox -t 8svx - -t aiff -r 16000 -', '--')
  42. table['8svx'] = t
  43.  
  44. t = pipes.Template()
  45. t.append('sox -t sndt - -t aiff -r 16000 -', '--')
  46. table['sndt'] = t
  47.  
  48. t = pipes.Template()
  49. t.append('sox -t sndr - -t aiff -r 16000 -', '--')
  50. table['sndr'] = t
  51.  
  52. uncompress = pipes.Template()
  53. uncompress.append('uncompress', '--')
  54.  
  55.  
  56. error = 'toaiff.error' # Exception
  57.  
  58. def toaiff(filename):
  59.     temps = []
  60.     ret = None
  61.     try:
  62.         ret = _toaiff(filename, temps)
  63.     finally:
  64.         for temp in temps[:]:
  65.             if temp <> ret:
  66.                 try:
  67.                     os.unlink(temp)
  68.                 except os.error:
  69.                     pass
  70.                 temps.remove(temp)
  71.     return ret
  72.  
  73. def _toaiff(filename, temps):
  74.     if filename[-2:] == '.Z':
  75.         fname = tempfile.mktemp()
  76.         temps.append(fname)
  77.         sts = uncompress.copy(filename, fname)
  78.         if sts:
  79.             raise error, filename + ': uncomress failed'
  80.     else:
  81.         fname = filename
  82.     try:
  83.         ftype = sndhdr.whathdr(fname)
  84.         if ftype:
  85.             ftype = ftype[0] # All we're interested in
  86.     except IOError:
  87.         if type(msg) == type(()) and len(msg) == 2 and \
  88.             type(msg[0]) == type(0) and type(msg[1]) == type(''):
  89.             msg = msg[1]
  90.         if type(msg) <> type(''):
  91.             msg = `msg`
  92.         raise error, filename + ': ' + msg
  93.     if ftype == 'aiff':
  94.         return fname
  95.     if ftype == None or not table.has_key(ftype):
  96.         raise error, \
  97.             filename + ': unsupported audio file type ' + `ftype`
  98.     temp = tempfile.mktemp()
  99.     temps.append(temp)
  100.     sts = table[ftype].copy(fname, temp)
  101.     if sts:
  102.         raise error, filename + ': conversion to aiff failed'
  103.     return temp
  104.